#include<iostream>
#include<cstring>
#include<stack>
#include<cmath> // 用于 trunc 函数
using namespace std;

// 修改 pow 函数以处理 double 类型
double pow(double a, int n){
   if(n == 0) return 1;
   else {
       if(n % 2){
           double half = pow(a, n / 2);
           return half * half * a;
       }
       else {
           double half = pow(a, n / 2);
           return half * half;
       }
   }
}

// 处理运算符的函数
int yss(stack<double>& num1, stack<int>& cz1){
    int bj = 0;  // 标记是否出错
    double a = num1.top();
    num1.pop();
    double b = num1.top();
    num1.pop();
    int czs = cz1.top();
    cz1.pop();
    
    if(czs == '+') num1.push(b + a);
    else if(czs == '-') num1.push(b - a);
    else if(czs == '*') num1.push(b * a);
    else if(czs == '/'){
        if(a != 0) {
            num1.push(trunc(b / a));  // 对除法结果截尾处理
        }
        else {
         //避免出现空栈
            bj = 1;  // 如果除数为 0，则标记为错误
        }
    }
    else if(czs == '^') {
        num1.push(pow(b, (int)a));  // 幂运算，a 为指数
    }
    return bj; // 返回是否出错
}

char a[3000];
int ys[300];
stack<double> nums;  // 将操作数栈改为 double
stack<int> cz;       // 运算符栈保持为 int 类型

int main(){
    // 初始化运算符优先级
    ys['+'] = 1;
    ys['-'] = 1;
    ys['*'] = 2;
    ys['/'] = 2;
    ys['^'] = 3;
    while(cin >> a){
        int len = strlen(a);
        int cw = 0;  // 错误标志
        for(int i = 0; i < len; i++){
            if(cw){
                break;
            }
            int bj = 0;  // 是否为数字的标志
            double num = 0;
            // 处理多位数字
            while(a[i] >= '0' && a[i] <= '9'){
                bj = 1;
                num = num * 10 + (a[i] - '0');
                i++;
            }
            if(bj) {
                nums.push(num);  // 将数字压入操作数栈
                i--;
                continue;
            }
            else {
                if(a[i] == '(') cz.push(a[i]);
                else if(a[i] == ')'){
                    while(!cz.empty() && cz.top() != '('){
                        if(yss(nums, cz)){
                            cw = 1;  // 如果出错，标记为错误
                            break;
                        }
                    }
                    if(!cz.empty()) cz.pop();  // 弹出左括号
                }
                else {
                    while(!cz.empty() && cz.top() != '(' && ys[cz.top()] >= ys[a[i]] && !cw){
                        if(yss(nums, cz)) cw = 1;  // 处理运算符栈顶元素
                    }
                    cz.push(a[i]);  // 将当前运算符压入栈
                }
            }
        }
        if(cw) cout << "INVALID" << endl;
        else {
            while(!cz.empty() && !nums.empty()){
                if(yss(nums, cz)){
                    cw = 1;
                    break;
                }
            }
            if(cw) cout << "INVALID" << endl;
            else if(!nums.empty()){
                // 输出结果并进行截尾处理
                cout << (int)nums.top() << endl;
                nums.pop();
            }
        }
        // 清空栈以准备处理下一个表达式
        while(!cz.empty()) cz.pop();
        while(!nums.empty()) nums.pop();
    }
    return 0;
}
